#!/bin/bash  
  
# CMD_OPTION 命令参数 如--log
CMD_OPTION="$2"

##### APP_ID 全局唯一小于15个字符的APP标志
#用来修复pgrep和pkill在文件中执行只能检索不大于15个字符的名称
#这是15个字符的长度示例
#APP_ID="123456789ABCDEF"
APP_ID="sun-prod-1"
# 定义应用程序的路径和名称  
APP_PATH="/data/hc"  
JAR_FILE="MicroCommunityBoot.jar"
  
# 定义日志文件路径 
LOG_DIR="$APP_PATH/logs/"
# 定义日志文件路径
LOG_FILE="$LOG_DIR/stdout"
# JAVA_OPTION
# JAVA_OPTION="-Xms128m -Xmx256m -XX:MaxPermSize=64m"
JAVA_OPTION=""  
# REMOTE_JVM_DEBUG
#REMOTE_JVM_DEBUG="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005"
# SPRING_BOOT_OPTION 
SPRING_BOOT_OPTION="--spring.profiles.active=prod"

# 定义JAR执行命令  
JAR_CMD="java -DappId=$APP_ID -jar $JAVA_OPTION $REMOTE_JVM_DEBUG $APP_PATH/$JAR_FILE $SPRING_BOOT_OPTION"


# 启动应用程序  
function start() {
    echo "启动 $APP_ID..."
    #如果日志文件不存在就创建一个  
    if [ ! -d ${LOG_DIR} ]; then
      mkdir -p ${LOG_DIR}
    fi
    nohup $JAR_CMD > $LOG_FILE 2>&1 &
    echo "$APP_ID 启动了."
    # 检查第二个参数是否是 -g 或者 --log  
    if [[ "$CMD_OPTION" == "-g" || "$CMD_OPTION" == "--log" ]]; then  
        # 如果是，执行 tail -f $LOG_FILE  
	tail -fn500 "$LOG_FILE"  
    fi  
}

# 停止应用程序  
function stop() {
    echo "停止 $APP_ID..."
    pkill -f "$APP_ID"
    # 等待进程关闭，最多等待10秒  
    count=0
    while pgrep -f "$APP_ID" > /dev/null && [ $count -lt 10 ]; do
      echo "$APP_ID 正在停止..."
      sleep 1
      count=$((count + 1))
    done
        # 检查进程是否最终关闭  
    if [ $count -eq 10 ]; then
      echo "$APP_ID 停止失败手动处理."
    else
      echo "$APP_ID 安全停止."
    fi
}

# 重启应用程序  
function restart() {
    echo "重启 $APP_ID..."
    pkill -f "$APP_ID" && start
    echo "$APP_ID 重启了."
}

# 检查应用程序状态  
function status() {
    if pgrep -f "$APP_ID" > /dev/null; then
        echo "$APP_ID 正在运行."
        echo `pgrep -fa "$APP_ID"`
    else
        echo "$APP_ID 已经停止."
    fi
}

# 根据命令行参数执行相应的操作  
case "$1" in
    start) start ;;
    stop) stop ;;
    restart) restart ;;
    status) status ;;
    *) echo "Usage: $0 {start|stop|restart|status} [-g|--log]" && exit 1 ;;
esac
 
